package com.cictec.middleware.tde.rm.disp;

import java.util.Date;

import com.cictec.middleware.commons.utils.Constants;
import com.cictec.middleware.commons.utils.PropertiesUtils;
import com.cictec.middleware.tde.rm.protocol.TerminalMessage;
import com.cictec.middleware.tde.rm.protocol.TerminalMessage.Header;
import com.cictec.middleware.tde.rm.protocol.rm.message.Rm0x80PlatformMessage;
import com.cictec.middleware.tde.rm.protocol.rm.message.Rm0x81PlatformMessage;
import com.cictec.middleware.tde.rm.protocol.rm.message.Rm0x82PlatformMessage;
import com.cictec.middleware.tde.rm.protocol.rm.message.Rm0xA2PlatformMessage;
import com.cictec.middleware.tde.rm.protocol.rm.message.Rm0xA6PlatformMessage;
import com.cictec.middleware.tde.rm.protocol.rm.message.Rm0xBCPlatformMessage;
import com.cictec.middleware.tde.rm.protocol.rm.message.Rm0xC1PlatformMessage;

/**
 * 锐明协议消息构件器
 * 
 * @author Administrator
 *
 */
public abstract class MessageBuilder {

	/**
	 * 【0xC1】 下发升级车载终端升级
	 * 
	 * @param devCode
	 * @param sessionId
	 *            会话id
	 * @param updateType
	 *            升级类型
	 * @param fileName
	 *            文件名
	 * @param fileVersion
	 *            版本
	 * @param fileSize
	 *            文件大小
	 * @param fileOffset
	 * @param crc
	 * @return
	 */
	public Rm0xC1PlatformMessage createUpdateBusFileMessage(String devCode, String sessionId, int updateType,
			String fileName, String fileVersion, int fileSize, long fileOffset, String crc) {

		Header header = new Header(0xC1);
		header.setTerminalId(Integer.parseInt(devCode));
		header.setDataFlag(0);
		Rm0xC1PlatformMessage msg = new Rm0xC1PlatformMessage(header);

		msg.setAddress(PropertiesUtils.getString("uploadDevFile.Serverhost"));
		msg.setPort(PropertiesUtils.getString("uploadDevFile.Port"));

		msg.setUbf_sessionId(sessionId);
		msg.setCreateTime(new Date());
		msg.setFileName(fileName);
		msg.setFileNameLen(fileName.length());
		msg.setFileVersion(fileVersion);
		msg.setFileVersionLen(fileVersion.length());
		msg.setFileSize(fileSize);
		msg.setFileOffset(fileOffset);
		msg.setCrc(Long.parseLong(crc));
		msg.setUpdateType(updateType);

		return msg;
	}

	/**
	 * 【0xCB】 下发报站文件,ftp模式
	 * 
	 * @param devCode
	 * @param sessionId
	 *            会话id
	 * @param updateType
	 *            升级类型
	 * @param fileCatalog
	 *            文件目录
	 * @param fileName
	 *            文件名
	 * @param crc
	 *            文件crc32校验码
	 * @return
	 */
	public Rm0xBCPlatformMessage createUpdateBusFileByFTPMessage(String devCode, String sessionId, int updateType,
			String fileCatalog, String fileName, String crc) {

		Header header = new Header(0xCB);
		header.setTerminalId(Integer.parseInt(devCode));
		header.setDataFlag(0);
		Rm0xBCPlatformMessage msg = new Rm0xBCPlatformMessage(header);

		msg.setCreateTime(new Date());
		msg.setUpdateType(updateType);
		msg.setDeviceModelLengh(3);
		msg.setDeviceModel("X15");// A3为X11,A5为X15
		msg.setSessIdLength(sessionId.length());
		msg.setSessId(sessionId);
		msg.setAddress(PropertiesUtils.getString("uploadDevFile.FtpServerhost"));
		msg.setPort(PropertiesUtils.getString("uploadDevFile.FtpPort"));
		msg.setFileCatalogLength(fileCatalog.length());
		msg.setFileCatalog(fileCatalog);
		msg.setFileNameLength(fileName.length());
		msg.setFileName(fileName);
		String ftpUser = PropertiesUtils.getString("uploadDevFile.FtpUser");
		String ftpPassWord = PropertiesUtils.getString("uploadDevFile.FtpPassWord");
		msg.setFtpUserLength(ftpUser.length());
		msg.setFtpUser(ftpUser);
		msg.setFtpPassWordLengh(ftpPassWord.length());
		msg.setFtpPassWord(ftpPassWord);
		msg.setFileDownLoadTime(0);// 文件下载时间
		msg.setFileUpdateTime(0);// 开始升级时间
		msg.setCrc(Long.parseLong(crc));

		return msg;
	}

	/**
	 * 【0xA2】 报站文件切换 报站文件切换指令消息下发
	 * 
	 * @param devCode
	 * @param newLineId
	 * @return
	 */
	public Rm0xA2PlatformMessage createChangeLineMessage(int devCode, int newLineId) {

		Header header = new Header(0xA2);
		header.setTerminalId(devCode);

		Rm0xA2PlatformMessage msg = new Rm0xA2PlatformMessage(header);
		msg.setCreateTime(new Date());
		msg.setLineId(newLineId);

		return msg;
	}

	/**
	 * 【0xA6】【下发运营状态】【切换车辆运营状态】
	 * 
	 * @param devCode
	 *            设备编号
	 * @param typeValue
	 *            运营状态类型
	 * @param departureTime
	 *            如果车辆非营运状态，则为 0；1运营
	 */
	public Rm0xA6PlatformMessage createChangeOperateMessage(long devCode, String typeValue, long departureTime,
			String content) {

		Header opera = new Header(0xA6);
		opera.setTerminalId(devCode);

		Rm0xA6PlatformMessage msg = new Rm0xA6PlatformMessage(opera);
		msg.setCreateTime(new Date());
		msg.setContent(content);
		msg.setDepartureTime(departureTime);
		msg.setReserved(1); // 预留字段

		return msg;
	}

	/**
	 * 【0x81】司机签到后语音提示
	 * @param lineId
	 * @param devCode
	 * @param content
	 * @return
	 */
	public Rm0x81PlatformMessage createDriverSignResponseMessage(int lineId, long devCode, String content) {

		Header header = new Header(0x81);
		header.setLineId(lineId);
		header.setTerminalId(devCode);
		Rm0x81PlatformMessage msg = new Rm0x81PlatformMessage(header);
		msg.setCreateTime(new Date());
		msg.setMessageType(0x02);
		msg.setResponseType(0);
		msg.setDisplayOn(Rm0x81PlatformMessage.DISPLAY_ON_DRIVER_LCD);
		msg.setDisplayTimes(2);
		msg.setVoiceType(1);
		msg.setContent(content);
		
		return msg;
	}

	
	
	
	
	/**
	 * 【0x81】【下发短信，播放语音提示】
	 * 
	 * @param lineId
	 *            设备线路id
	 * @param devCode
	 *            设备编码
	 * @param messageType
	 *            消息类型，详见 Rm0x81PlatformMessage 中定义
	 * @param responseType
	 *            0：【不需要回复】 1：【需要回复】
	 * @param displayOn
	 *            显示位置  详见 Rm0x81PlatformMessage 中定义
	 * @param displayTimes
	 *            显示次数
	 * @param voiceType
	 *            声音类型表（0 为不播放，1 为播放）
	 * @param content
	 *            播放内容
	 */
	public Rm0x81PlatformMessage createSendMessage(int lineId, long devCode, int messageType, int responseType, int displayOn, int displayTimes, int voiceType, String content) {

		
		
		Header header = new Header(0x81);
		header.setLineId(lineId);
		header.setTerminalId(devCode);
		header.setDataFlag(0);

		Rm0x81PlatformMessage msg = new Rm0x81PlatformMessage(header);
		msg.setCreateTime(new Date());
		msg.setMessageType(messageType);
		msg.setResponseType(responseType);
		msg.setDisplayOn(displayOn); // 显示位置
		msg.setDisplayTimes(displayTimes);
		msg.setVoiceType(voiceType);
		msg.setContent(content);

		return msg;
	}

	/**
	 * 【0x82】设置位置数据上传的时间间隔
	 * 
	 * @param message
	 * @return
	 */
	public Rm0x82PlatformMessage createUploadInterval(TerminalMessage message) {
		/* **** 设置位置数据上传的时间间隔 start ************************/
		Header pshcHeader = new Header(0x82);
		pshcHeader.setLineId(message.getHeader().getLineId());
		pshcHeader.setTerminalId(message.getHeader().getTerminalId());
		pshcHeader.setDataFlag(0);

		Rm0x82PlatformMessage msg = new Rm0x82PlatformMessage(pshcHeader);
		msg.setUploadInterval(Constants.VAL_INTERVAL_TIME);
		msg.setSessionId(message.getSessionId());

		return msg;
		/* ******** end ****************************/
	}

	/**
	 * 【0x80】 指令应答 收到需要应答的数据包
	 * 
	 * @param msg
	 * @return
	 */
	public Rm0x80PlatformMessage createResponse(TerminalMessage msg) {

		Header header = new Header(0x80);

		header.setLineId(msg.getHeader().getLineId());
		header.setTerminalId(msg.getHeader().getTerminalId());
		header.setDataFlag(0);

		Rm0x80PlatformMessage pr = new Rm0x80PlatformMessage(header);
		pr.setResponseMessageId(msg.getHeader().getMessageId());
		pr.setResponseMessageSequence(msg.getHeader().getMessageSequence());
		pr.setResponseTime(new Date());

		pr.setSessionId(msg.getSessionId());

		return pr;

	}

	/**
	 * 【0x80】 指令应答 收到需要应答的数据包
	 * 
	 * @param msg
	 * @param responseType
	 *            【0：自动应答 1：手动应答】【当所应答的数据包为连接请求时，应答类型中的 0 表示禁止连接，1 表示允许连接】
	 * @return
	 */
	public Rm0x80PlatformMessage createResponse(TerminalMessage msg, int responseType) {

		Header header = new Header(0x80);

		header.setLineId(msg.getHeader().getLineId());
		header.setTerminalId(msg.getHeader().getTerminalId());
		header.setDataFlag(0);

		Rm0x80PlatformMessage pr = new Rm0x80PlatformMessage(header);
		pr.setResponseMessageId(msg.getHeader().getMessageId());
		pr.setResponseMessageSequence(msg.getHeader().getMessageSequence());
		pr.setResponseTime(new Date());
		pr.setResponseType(responseType);
		pr.setSessionId(msg.getSessionId());

		return pr;

	}
}
